#include "inc\New.h"

/* ----------------------------------------------------------------------------------------------- *
 *	динамическое создание/уничтожение объектов
 */

void * new(const void * _pClass, ...)
{
	const CLASS * pClass = _pClass;
	void * pSelf = malloc(pClass->size);

	assert( pSelf );

	*(const CLASS **) pSelf = pClass;

	if ( pClass->pfnCtor )
	{
		va_list pArgs;
		va_start(pArgs, _pClass);
		pSelf = pClass->pfnCtor(pSelf, &pArgs);
		va_end(pArgs);
	}

	return pSelf;
}

void delete(void * _pSelf)
{
	const CLASS ** ppClass = _pSelf;
	
	if ( _pSelf && *ppClass && (*ppClass)->pfnDtor )
		_pSelf = (* ppClass)->pfnDtor(_pSelf);
	
	free(_pSelf);
}

/* ----------------------------------------------------------------------------------------------- *
 *	функции с динамическим связыванием (dynamic linking)
 */

void draw(const void * _pSelf)
{
	const CLASS * const * ppClass = _pSelf;
	assert( _pSelf && *ppClass && (*ppClass)->pfnDraw );
	(*ppClass)->pfnDraw(_pSelf);
}